#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
场景化自动决策系统用户界面
提供交互式的一键化场景选择和部署功能
"""

import os
import sys
import json
import time
from pathlib import Path

# 添加项目根目录到Python路径
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))

try:
    from core.utils import color_green, color_yellow, color_red, color_blue
    from modules.intelligence.scenario_template_engine import ScenarioType
    from apps.scenario_auto_decision_main import ScenarioAutoDecisionSystem, OptimizationLevel
except ImportError as e:
    print("导入模块失败: {}".format(e))
    sys.exit(1)

# Python 2/3 兼容性处理
import sys
if sys.version_info[0] == 2:
    input = raw_input

def color_cyan(text):
    """青色输出，使用蓝色替代"""
    return color_blue(text)

def clear_screen():
    """清屏"""
    os.system('cls' if os.name == 'nt' else 'clear')

def print_banner():
    """打印横幅"""
    banner = """
╔══════════════════════════════════════════════════════════════╗
║                    场景化自动决策系统                          ║
║                  Scenario Auto Decision System                ║
║                                                              ║
║  🎯 智能场景识别  🚀 一键化部署  ⚙️ 参数优化  📊 风险评估    ║
╚══════════════════════════════════════════════════════════════╝
"""
    color_cyan(banner)

def print_menu():
    """打印主菜单"""
    menu = """
┌─────────────────── 主菜单 ───────────────────┐
│                                            │
│  [1] 🔍 自动场景检测                        │
│  [2] 📋 手动选择场景                        │
│  [3] 🚀 一键化部署                          │
│  [4] 📊 完整分析报告                        │
│  [5] ⚙️ 系统设置                           │
│  [6] 📖 帮助信息                           │
│  [0] 🚪 退出系统                           │
│                                            │
└────────────────────────────────────────────┘
"""
    color_yellow(menu)

def print_scenario_menu():
    """打印场景选择菜单"""
    scenarios = [
        ("企业内网", "ENTERPRISE_NETWORK", "🏢"),
        ("个人测试", "PERSONAL_TEST", "🧪"),
        ("高安全环境", "HIGH_SECURITY", "🔒"),
        ("云服务器", "CLOUD_SERVER", "☁️"),
        ("容器环境", "CONTAINER", "📦"),
        ("开发环境", "DEVELOPMENT", "💻"),
        ("生产环境", "PRODUCTION", "🏭"),
        ("物联网设备", "IOT_DEVICE", "🌐")
    ]
    
    color_yellow("\n┌─────────────────── 场景选择 ───────────────────┐")
    color_yellow("│                                              │")
    
    for i, (name, value, icon) in enumerate(scenarios, 1):
        color_yellow("│  [{}] {} {}".format(i, icon, name).ljust(45) + "│")
    
    color_yellow("│  [0] 🔙 返回主菜单".ljust(45) + "│")
    color_yellow("│                                              │")
    color_yellow("└──────────────────────────────────────────────┘")
    
    return scenarios

def print_settings_menu():
    """打印设置菜单"""
    menu = """
┌─────────────────── 系统设置 ───────────────────┐
│                                              │
│  [1] ⚙️ 优化级别设置                          │
│  [2] 🎯 推荐数量设置                          │
│  [3] ⚠️ 风险阈值设置                          │
│  [4] 🔍 调试模式开关                          │
│  [5] 📁 输出目录设置                          │
│  [0] 🔙 返回主菜单                           │
│                                              │
└──────────────────────────────────────────────┘
"""
    color_yellow(menu)

class ScenarioUI:
    """场景化自动决策系统用户界面"""
    
    def __init__(self):
        """初始化用户界面"""
        self.system = None
        self.settings = {
            'optimization_level': 'balanced',
            'max_recommendations': 5,
            'risk_threshold': 0.7,
            'debug_mode': False,
            'output_dir': './reports',
            'dry_run': True
        }
        self.load_settings()
    
    def load_settings(self):
        """加载设置"""
        try:
            settings_file = Path(__file__).parent / 'ui_settings.json'
            if settings_file.exists():
                with open(settings_file, 'r', encoding='utf-8') as f:
                    saved_settings = json.load(f)
                    self.settings.update(saved_settings)
        except Exception as e:
            color_yellow("⚠️ 加载设置失败，使用默认设置: {}".format(e))
    
    def save_settings(self):
        """保存设置"""
        try:
            settings_file = Path(__file__).parent / 'ui_settings.json'
            with open(settings_file, 'w', encoding='utf-8') as f:
                json.dump(self.settings, f, ensure_ascii=False, indent=2)
            color_green("✓ 设置已保存")
        except Exception as e:
            color_red("❌ 保存设置失败: {}".format(e))
    
    def init_system(self):
        """初始化系统"""
        if self.system is None:
            optimization_level = {
                'conservative': OptimizationLevel.CONSERVATIVE,
                'balanced': OptimizationLevel.BALANCED,
                'aggressive': OptimizationLevel.AGGRESSIVE
            }[self.settings['optimization_level']]
            
            color_blue("🚀 正在初始化系统...")
            self.system = ScenarioAutoDecisionSystem(optimization_level)
            color_green("✓ 系统初始化完成")
    
    def run(self):
        """运行用户界面"""
        while True:
            clear_screen()
            print_banner()
            print_menu()
            
            try:
                choice = input("\n请选择操作 [0-6]: ").strip()
                
                if choice == '0':
                    self.exit_system()
                    break
                elif choice == '1':
                    self.auto_detect_scenario()
                elif choice == '2':
                    self.manual_select_scenario()
                elif choice == '3':
                    self.one_click_deploy()
                elif choice == '4':
                    self.full_analysis()
                elif choice == '5':
                    self.settings_menu()
                elif choice == '6':
                    self.show_help()
                else:
                    color_red("❌ 无效选择，请重新输入")
                    input("\n按回车键继续...")
                    
            except KeyboardInterrupt:
                color_yellow("\n\n⚠️ 用户中断操作")
                break
            except Exception as e:
                color_red("❌ 操作失败: {}".format(e))
                input("\n按回车键继续...")
    
    def auto_detect_scenario(self):
        """自动场景检测"""
        clear_screen()
        color_cyan("🔍 自动场景检测")
        color_cyan("=" * 50)
        
        self.init_system()
        
        try:
            scenario_type, confidence = self.system.detect_scenario()
            
            if scenario_type:
                color_green("\n✓ 场景检测完成!")
                color_yellow("检测到场景: {}".format(scenario_type.value))
                color_yellow("置信度: {:.1%}".format(confidence))
                
                # 询问是否继续
                choice = input("\n是否基于此场景继续操作? [y/N]: ").strip().lower()
                if choice in ['y', 'yes']:
                    self.process_scenario(scenario_type)
            else:
                color_red("❌ 场景检测失败")
                
        except Exception as e:
            color_red("❌ 场景检测出错: {}".format(e))
        
        input("\n按回车键继续...")
    
    def manual_select_scenario(self):
        """手动选择场景"""
        clear_screen()
        color_cyan("📋 手动选择场景")
        color_cyan("=" * 50)
        
        scenarios = print_scenario_menu()
        
        try:
            choice = input("\n请选择场景 [0-{}]: ".format(len(scenarios))).strip()
            
            if choice == '0':
                return
            
            choice_idx = int(choice) - 1
            if 0 <= choice_idx < len(scenarios):
                scenario_name, scenario_value, icon = scenarios[choice_idx]
                scenario_type = ScenarioType(scenario_value)
                
                color_green("✓ 已选择场景: {} {}".format(icon, scenario_name))
                self.process_scenario(scenario_type)
            else:
                color_red("❌ 无效选择")
                
        except ValueError:
            color_red("❌ 请输入有效数字")
        except Exception as e:
            color_red("❌ 选择失败: {}".format(e))
        
        input("\n按回车键继续...")
    
    def process_scenario(self, scenario_type):
        """处理选定的场景"""
        color_blue("\n🎯 处理场景: {}".format(scenario_type.value))
        
        self.init_system()
        
        # 选择场景模板
        template = self.system.select_scenario_template(scenario_type)
        
        if template:
            # 询问下一步操作
            color_yellow("\n请选择下一步操作:")
            color_yellow("[1] 🚀 立即部署")
            color_yellow("[2] 📊 详细分析")
            color_yellow("[3] 🔙 返回")
            
            choice = input("\n请选择 [1-3]: ").strip()
            
            if choice == '1':
                self.deploy_scenario(scenario_type)
            elif choice == '2':
                self.analyze_scenario(scenario_type)
    
    def one_click_deploy(self):
        """一键化部署"""
        clear_screen()
        color_cyan("🚀 一键化部署")
        color_cyan("=" * 50)
        
        self.init_system()
        
        # 确认部署模式
        color_yellow("部署模式:")
        color_yellow("[1] 🔍 模拟部署 (推荐)")
        color_yellow("[2] ⚡ 实际部署 (谨慎)")
        
        mode_choice = input("\n请选择部署模式 [1-2]: ").strip()
        dry_run = mode_choice != '2'
        
        if mode_choice == '2':
            color_red("⚠️ 警告: 您选择了实际部署模式!")
            confirm = input("确认继续? 输入 'YES' 确认: ").strip()
            if confirm != 'YES':
                color_yellow("已取消部署")
                input("\n按回车键继续...")
                return
        
        try:
            color_blue("\n🚀 开始一键化部署...")
            result = self.system.one_click_deploy(dry_run=dry_run)
            
            if result.get('success'):
                if result.get('dry_run'):
                    color_yellow("🔍 模拟部署完成")
                else:
                    color_green("✓ 部署成功!")
            else:
                color_red("❌ 部署失败")
                
        except Exception as e:
            color_red("❌ 部署出错: {}".format(e))
        
        input("\n按回车键继续...")
    
    def deploy_scenario(self, scenario_type):
        """部署指定场景"""
        color_blue("\n🚀 部署场景: {}".format(scenario_type.value))
        
        try:
            result = self.system.one_click_deploy(scenario_type, self.settings['dry_run'])
            
            if result.get('success'):
                color_green("✓ 场景部署成功!")
            else:
                color_red("❌ 场景部署失败")
                
        except Exception as e:
            color_red("❌ 部署出错: {}".format(e))
    
    def analyze_scenario(self, scenario_type):
        """分析指定场景"""
        color_blue("\n📊 分析场景: {}".format(scenario_type.value))
        
        try:
            report = self.system.run_scenario_analysis(
                scenario_type=scenario_type,
                max_recommendations=self.settings['max_recommendations'],
                risk_threshold=self.settings['risk_threshold'],
                dry_run=self.settings['dry_run']
            )
            
            # 保存报告
            timestamp = time.strftime("%Y%m%d_%H%M%S")
            filename = "scenario_analysis_{}.json".format(timestamp)
            output_path = Path(self.settings['output_dir']) / filename
            
            output_path.parent.mkdir(parents=True, exist_ok=True)
            
            with open(output_path, 'w', encoding='utf-8') as f:
                json.dump(report, f, ensure_ascii=False, indent=2)
            
            color_green("✓ 分析完成，报告已保存到: {}".format(output_path))
            
        except Exception as e:
            color_red("❌ 分析出错: {}".format(e))
    
    def full_analysis(self):
        """完整分析报告"""
        clear_screen()
        color_cyan("📊 完整分析报告")
        color_cyan("=" * 50)
        
        self.init_system()
        
        try:
            color_blue("🔍 开始完整分析...")
            
            report = self.system.run_scenario_analysis(
                max_recommendations=self.settings['max_recommendations'],
                risk_threshold=self.settings['risk_threshold'],
                dry_run=self.settings['dry_run']
            )
            
            # 显示摘要
            if 'summary' in report:
                summary = report['summary']
                color_cyan("\n📋 分析摘要:")
                color_yellow("  检测场景: {}".format(summary.get('scenario_detected', '未检测')))
                color_yellow("  推荐数量: {}".format(summary.get('total_recommendations', 0)))
                color_yellow("  高优先级: {}".format(summary.get('high_priority_recommendations', 0)))
                color_yellow("  关键风险: {}".format(summary.get('critical_risks', 0)))
                color_yellow("  分析耗时: {}秒".format(report.get('analysis_time', 0)))
            
            # 保存报告
            timestamp = time.strftime("%Y%m%d_%H%M%S")
            filename = "full_analysis_{}.json".format(timestamp)
            output_path = Path(self.settings['output_dir']) / filename
            
            output_path.parent.mkdir(parents=True, exist_ok=True)
            
            with open(output_path, 'w', encoding='utf-8') as f:
                json.dump(report, f, ensure_ascii=False, indent=2)
            
            color_green("\n✓ 完整分析完成，报告已保存到: {}".format(output_path))
            
        except Exception as e:
            color_red("❌ 分析出错: {}".format(e))
        
        input("\n按回车键继续...")
    
    def settings_menu(self):
        """设置菜单"""
        while True:
            clear_screen()
            color_cyan("⚙️ 系统设置")
            color_cyan("=" * 50)
            
            # 显示当前设置
            color_yellow("当前设置:")
            color_yellow("  优化级别: {}".format(self.settings['optimization_level']))
            color_yellow("  推荐数量: {}".format(self.settings['max_recommendations']))
            color_yellow("  风险阈值: {}".format(self.settings['risk_threshold']))
            color_yellow("  调试模式: {}".format('开启' if self.settings['debug_mode'] else '关闭'))
            color_yellow("  输出目录: {}".format(self.settings['output_dir']))
            
            print_settings_menu()
            
            try:
                choice = input("\n请选择设置项 [0-5]: ").strip()
                
                if choice == '0':
                    break
                elif choice == '1':
                    self.set_optimization_level()
                elif choice == '2':
                    self.set_max_recommendations()
                elif choice == '3':
                    self.set_risk_threshold()
                elif choice == '4':
                    self.toggle_debug_mode()
                elif choice == '5':
                    self.set_output_dir()
                else:
                    color_red("❌ 无效选择")
                    input("\n按回车键继续...")
                    
            except KeyboardInterrupt:
                break
            except Exception as e:
                color_red("❌ 设置失败: {}".format(e))
                input("\n按回车键继续...")
    
    def set_optimization_level(self):
        """设置优化级别"""
        color_cyan("\n⚙️ 优化级别设置")
        color_yellow("[1] 保守 (conservative)")
        color_yellow("[2] 平衡 (balanced)")
        color_yellow("[3] 激进 (aggressive)")
        
        choice = input("\n请选择优化级别 [1-3]: ").strip()
        
        levels = {'1': 'conservative', '2': 'balanced', '3': 'aggressive'}
        if choice in levels:
            self.settings['optimization_level'] = levels[choice]
            self.system = None  # 重置系统以应用新设置
            self.save_settings()
            color_green("✓ 优化级别已设置为: {}".format(levels[choice]))
        else:
            color_red("❌ 无效选择")
        
        input("\n按回车键继续...")
    
    def set_max_recommendations(self):
        """设置推荐数量"""
        color_cyan("\n🎯 推荐数量设置")
        
        try:
            value = int(input("请输入推荐数量 (1-20): ").strip())
            if 1 <= value <= 20:
                self.settings['max_recommendations'] = value
                self.save_settings()
                color_green("✓ 推荐数量已设置为: {}".format(value))
            else:
                color_red("❌ 推荐数量必须在1-20之间")
        except ValueError:
            color_red("❌ 请输入有效数字")
        
        input("\n按回车键继续...")
    
    def set_risk_threshold(self):
        """设置风险阈值"""
        color_cyan("\n⚠️ 风险阈值设置")
        
        try:
            value = float(input("请输入风险阈值 (0.0-1.0): ").strip())
            if 0.0 <= value <= 1.0:
                self.settings['risk_threshold'] = value
                self.save_settings()
                color_green("✓ 风险阈值已设置为: {}".format(value))
            else:
                color_red("❌ 风险阈值必须在0.0-1.0之间")
        except ValueError:
            color_red("❌ 请输入有效数字")
        
        input("\n按回车键继续...")
    
    def toggle_debug_mode(self):
        """切换调试模式"""
        self.settings['debug_mode'] = not self.settings['debug_mode']
        self.save_settings()
        status = '开启' if self.settings['debug_mode'] else '关闭'
        color_green("✓ 调试模式已{}: {}".format(status, self.settings['debug_mode']))
        input("\n按回车键继续...")
    
    def set_output_dir(self):
        """设置输出目录"""
        color_cyan("\n📁 输出目录设置")
        
        current_dir = self.settings['output_dir']
        new_dir = input("请输入输出目录 (当前: {}): ".format(current_dir)).strip()
        
        if new_dir:
            try:
                Path(new_dir).mkdir(parents=True, exist_ok=True)
                self.settings['output_dir'] = new_dir
                self.save_settings()
                color_green("✓ 输出目录已设置为: {}".format(new_dir))
            except Exception as e:
                color_red("❌ 设置输出目录失败: {}".format(e))
        
        input("\n按回车键继续...")
    
    def show_help(self):
        """显示帮助信息"""
        clear_screen()
        color_cyan("📖 帮助信息")
        color_cyan("=" * 50)
        
        help_text = """
🎯 场景化自动决策系统使用指南

1. 自动场景检测
   - 系统自动分析当前环境特征
   - 智能识别最适合的部署场景
   - 提供置信度评估

2. 手动选择场景
   - 从预定义场景中手动选择
   - 支持多种环境类型
   - 适用于已知环境情况

3. 一键化部署
   - 基于检测到的场景自动部署
   - 支持模拟和实际部署模式
   - 提供详细的部署报告

4. 完整分析报告
   - 生成详细的环境分析报告
   - 包含推荐、风险评估、参数优化
   - 支持导出JSON格式报告

5. 系统设置
   - 优化级别: 控制推荐策略的激进程度
   - 推荐数量: 设置生成推荐的最大数量
   - 风险阈值: 设置可接受的风险等级
   - 调试模式: 开启详细的调试信息
   - 输出目录: 设置报告保存位置

⚠️ 安全提醒:
- 建议首先使用模拟部署模式测试
- 在生产环境中谨慎使用实际部署
- 定期检查和清理部署的后门
- 遵守相关法律法规和授权范围

📞 技术支持:
- 查看系统日志获取详细错误信息
- 使用调试模式排查问题
- 检查网络连接和系统权限
"""
        
        color_yellow(help_text)
        input("\n按回车键继续...")
    
    def exit_system(self):
        """退出系统"""
        color_cyan("\n🚪 正在退出系统...")
        color_yellow("感谢使用场景化自动决策系统!")
        color_green("再见! 👋")


def main():
    """主函数"""
    try:
        ui = ScenarioUI()
        ui.run()
    except KeyboardInterrupt:
        color_yellow("\n\n⚠️ 用户中断操作")
    except Exception as e:
        color_red("\n❌ 系统错误: {}".format(e))
        import traceback
        traceback.print_exc()


if __name__ == "__main__":
    main()